package pro.cherish.knowledgedemoasync.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import pro.cherish.knowledgedemoasync.service.ThreadLocalParam;
import pro.cherish.knowledgedemoasync.t1.Child;
import pro.cherish.knowledgedemoasync.util.SpringUtil;

/**
 * @author 创建人：cherish
 * @version 版本号：V1.0
 * <p>
 * ***************************修订记录************************************
 * 2019-10-27 cherish 创建该类功能。
 * **********************************************************************
 * </p>
 * @ClassName 类名：User
 * @Description 功能说明：
 * <p>
 * TODO
 * </p>
 * **********************************************************************
 * @date 创建日期： 2019-10-27 cherish
 */
@Slf4j
@Component
public class User {

    @Autowired
    private Child child;


    /**
     * 用这种方式，在成员变量上可以注入，在方法中可以从容器中直接获取
     * 但是主线程的ThreadLocal值是无法在async中获取的，从打印线程名称就可以判断出不在一个线程，threadLocal变量是线程独立的
     * 解决方法，只能在方法形参上传递了
     */
    @Async
    public void takePhone_async() throws InterruptedException {
        log.info("begin   异步执行任务");
        Thread.sleep(2000);
        String currentUserName = ThreadLocalParam.threadLocalparam.get();
        Object child3 = SpringUtil.getBean("child3");
        log.info("debug  查看currentUserName是否为null {}", currentUserName);
        log.info("debug  查看child是否为null {}", child);
        log.info("debug  查看child3是否为null {}", child3);
        log.info("end   异步执行任务");
    }

}
